#include "ElasticArray.h"

#include <cstddef>
#include <iostream>

using std::cin;
using std::cout;
using std::endl;

#define TEST(cond) if (!(cond)) return false;

bool test0()
{
	ElasticArray a(0);
	a.push_back(1);
	a.set(170, 1);

	TEST(a.get(0) == 1);

	for (int i = 1; i < 170; i++) TEST(a.get(i) == 0);

	TEST(a.get(170) == 1);

	return true;
}

bool test1()
{
	ElasticArray a(20);
	for (int i = 0; i < 20; i++) a.push_back(1);

	for (int i = 0; i < 20; i++) TEST(a.get(i) == 1);

	TEST(a.get(170) == 0);

	TEST(a.get_size() == 20);

	return true;
}

bool test2()
{
	ElasticArray a(0);
	for (int i = 0; i < 300; i++) a.set(i, (i % 2 == 0 ? i : 0));

	for (int i = 0; i < 300; i++) TEST(a.get(i) == (i % 2 == 0 ? i : 0));

	TEST(a.get_size() == 300);

	return true;
}

bool test3()
{
	ElasticArray a(300);
	for (int i = 0; i < 300; i++) TEST(a.get(i) == 0);

	TEST(a.get_size() == 0);

	return true;
}

bool test4()
{
	ElasticArray a(300);
	for (int i = 0; i < 300; i++) a.set(i, i);

	ElasticArray b(0);

	TEST(b.get_size() == 0);

	b = a;

	for (int i = 0; i < 300; i++) TEST(b.get(i) == i);

	return true;
}

bool test5()
{
	ElasticArray a(0);
	ElasticArray b(10);
	b.push_back(42);

	b = a;

	TEST(b.get(0) == 0);
	TEST(b.get_size() == 0);

	return true;
}

bool (*tests[])() = {test0, test1, test2, test3, test4, test5, NULL};

void main()
{
	for (int i = 0; tests[i] != NULL; i++)
	{
		cout << "Test #" << i << (tests[i]() ? " passed" : " failed") << endl;
	}
}